package com.cg.design.graphicdesignpattern.memento.game;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 表示游戏主人公的类
 *
 * @program: LeetCode->Gamer
 * @description: 表示游戏主人公的类
 * @author: cg
 * @create: 2022-04-01 09:12
 **/
public class Gamer {

    /**
     * 当前所持金钱
     */
    private int money;
    /**
     * 当前获得的水果
     */
    private List<String> fruits = new ArrayList<>();
    /**
     * 随机数生成器
     */
    private final Random random = new Random();
    /**
     * 表示水果种类的数组
     */
    private final static String[] fruitsName = {"苹果", "葡萄", "香蕉", "橘子"};

    /**
     * 构造函数
     * @param money
     */
    public Gamer(int money) {
        this.money = money;
    }

    /**
     * 获取当前所持金钱
     * @return
     */
    public int getMoney() {
        return money;
    }

    /**
     * 游戏的主要方法，在该方法中，只要主人公没有破产，就会一直掷骰子，并根据骰子结果改变所有的金钱数目和水果个数
     */
    public void bet() {
        // 随机掷骰子
        int dice = random.nextInt(6) + 1;
        switch (dice) {
            // 骰子结果为1时，增加所持金钱
            case 1:
                money += 100;
                System.out.println(" 所持金钱增加了");
                break;
            // 骰子结果为2时，所持金钱减半
            case 2:
                money /= 2;
                System.out.println(" 所持金钱减半了");
                break;
            // 骰子结果为6时，获得水果
            case 6:
                String fruit = getFruit();
                System.out.println(" 获得了水果(" + fruit + ")");
                fruits.add(fruit);
                break;
            // 骰子结果为3、4、5时，则什么也不会发生
            default:
                System.out.println(" 什么都没有发生");
                break;
        }
    }

    /**
     * 拍摄快照
     * @return
     */
    public Memento createMemento() {
        Memento memento = new Memento(money);
        for (String fruit : fruits) {
            // 只保存好吃的水果
            if (fruit.startsWith("好吃的")) {
                memento.addFruit(fruit);
            }
        }
        return memento;
    }

    /**
     * 撤销快照
     * @param memento
     */
    public void restoreMemento(Memento memento) {
        this.money = memento.getMoney();
        this.fruits = memento.getFruits();
    }

    /**
     * 用字符串表示主人公状态
     * @return
     */
    @Override
    public String toString() {
        return "[money = " + money + ", fruits = " + fruits + ']';
    }

    /**
     * 获得一个水果
     * @return
     */
    private String getFruit() {
        String prefix = "";
        if (random.nextBoolean()) {
            prefix = "好吃的";
        }
        return prefix + fruitsName[random.nextInt(fruitsName.length)];
    }

}
